package jogador;

import baralho.carta.Valor;

import java.io.Serializable;
import java.util.Scanner;
import baralho.Mao;
import baralho.Mesa;
import baralho.carta.Naipe;


public class Interface extends InterfaceGeral implements Serializable {

		private Scanner teclado;// Scanner nao é serializable, para poder enviar pontuacao tenho de o fazer desaparecer. muahahah
	public Interface() {
		this.teclado = new Scanner(System.in);
	}
	
	@Override
	public void mostraMensagem(String mensagem){
		assert(mensagem != null);
		System.out.println(mensagem);
	}
	
	public boolean SimOuNao(String mensagem){
		assert(mensagem != null);
		System.out.println(mensagem);
		return (teclado.nextInt() == 1);
	}
	

//	@Override
//	public void mostraVencedorRonda(Jogada jogadaVencedora){
//		System.out.print("Vencedor da ronda: "+jogadaVencedora.getJogador().getId()+" "+jogadaVencedora.getJogador().getNome()+" com a carta "+jogadaVencedora.getCarta().toString()+"\n");
//	}

	@Override
	public void mostraMesa(Mesa mesa){
		assert(mesa != null);
		System.out.println("Na mesa:");
		for(int i=0; i<mesa.length(); i++){
			if(mesa.getJogada(i) != null){
				System.out.print(""+mesa.getJogada(i).getCarta().toString()+"\n");
			}
		}
		System.out.println();
	}

	public void mostraMao(Mao mao) {
		assert(mao != null);
		//System.out.println("Escolha uma carta: ");
		for(int i=0; i< mao.numCartas(); i++){
//			System.out.print(mao.getCarta(i).toString()+"\n");;
		}
	}

//	public void cartaNaoExisteMao() {
//		System.out.println("Essa carta j� n�o existe na m�o!");
//	}

//	public boolean aceitaOferta(int valor) {
//		System.out.println("Aceita oferta de "+valor+" (true (1) ou false(0))?");
//		return (teclado.nextInt() == 1);
//	}

	public int aumentaOferta(int valor, boolean pode_ser_igual) {
		if (!pode_ser_igual) {
			System.out.println("Introduza a sua oferta. O valor actual e de "
					+ valor + " O seu valor nao pode ser igual.");
		} else {
			System.out.println("Introduza a sua oferta. O valor actual e de "
					+ valor + " O seu valor pode ser igual.");
		}

		int resposta=0;
		resposta = teclado.nextInt();
		if(resposta >8 || resposta <-3 || resposta<0&&resposta*-3 <valor || resposta>0&&resposta<valor || resposta==valor&&!pode_ser_igual){
			resposta = 0;
		}
		return resposta;
	}

	public Naipe escolheTrunfo() {
		System.out.println("Escolha Trunfo (0 a 4) (0- Ouros, 1- Copas, 2- Espadas, 3- Paus, 4- Sem trunfo):");
		int i =teclado.nextInt();
		if (i == 4)
			return null;
		return Naipe.values()[i];
	}

//	public boolean haLeilao() {
//		System.out.println("Quer leilao (0 ou 1)?");
//		return (teclado.nextInt() == 1);
//	}

//	public boolean negativo() {
//		System.out.println("Quer jogar para negativos (nulos)? (0 ou 1)");
//		return (teclado.nextInt() == 1);
//	}

//	public int daCarta() {
//		return teclado.nextInt();
//		
//		
//	}

	
	public String daCartaString() {
		//Ao introduzir, por exemplo 'C2' ele devolve uma string 'COPAS DOIS'
		String input=teclado.nextLine();
		while ( input.equals("") || (verificaCartaInvalida(input))){
			System.out.println("Carta inv�lida, introduza outra.");
			input=teclado.nextLine();
		}
		input = input.trim();
		
		String valor;
		
		
		char n = input.charAt(0);
		String n2 = String.valueOf(n);
		String naipe = naipeString(n2);
	
		if(input.length() == 3 && input.charAt(1) == '1' && input.charAt(2) == '0')
			valor = "DEZ";
		else{
			char v = input.charAt(1);
			String v2 = String.valueOf(v);
			valor = valorString(v2);
		}
			
		String carta_final = new String( naipe + " " + valor);
		return carta_final;
		
		
	}

	private boolean verificaCartaInvalida(String input) {
		input = input.trim();
		
		if ((input.length() > 3) || (input.length() < 2) || ((input.length() == 3) && (input.charAt(2) != '0')) || 
				(input.length()==2) && (input.charAt(1) !='J' && input.charAt(1) !='Q' && input.charAt(1) !='K' && input.charAt(1) !='A' && (input.charAt(1)-'0' < 0 || input.charAt(1)-'0' > 9)))
			return true;
		return false;
	}

	public String valorString ( String v2){
		assert(v2 != null && !v2.equals(" "));
		//atribui o valor em String ao input introduzido.
		String valor = "";
		Valor[] valores = Valor.values();
		if( v2.equalsIgnoreCase("J") || v2.equalsIgnoreCase("Q") || v2.equalsIgnoreCase("K") || v2.equalsIgnoreCase("A")){
			if(v2.equalsIgnoreCase("A"))
				v2 = v2+"S";
			for(int i = 0; i != valores.length; i++){
				if(valores[i].name().equalsIgnoreCase(v2))
					valor = valores[i].name();
			}
		} else{
			int valor_numerico = (int)(v2.charAt(0) -'0');
			valor = valores[valor_numerico-2/*devido � estrutura do enumerado*/].name();
		}
		
		return valor;

	}
	
	public String naipeString(String naipe){
		assert(naipe != null && !naipe.equals("") );
		
		String n = "";
		
		if(naipe.equalsIgnoreCase("O"))
			n = "OUROS";
		else if(naipe.equalsIgnoreCase("C"))
			n="COPAS";
		else if(naipe.equalsIgnoreCase("E"))
			n="ESPADAS";
		else if(naipe.equalsIgnoreCase("P"))
			n="PAUS";
		
		return n;
	}

}
